/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package gardenmaker;

import java.awt.Graphics;
import java.awt.Rectangle;
import java.awt.geom.Area;
import java.io.File;
import java.util.LinkedList;

/**
 *
 * @author lenny
 */

public class Projeto {
    
    public static final int ESTADO_NONE=0;
    public static final int ESTADO_ADD_TREE=1;
    public static final int ESTADO_ADD_BUSH=2;
    public static final int ESTADO_SELECT=3;
    public static final int ESTADO_DOUBLE_CLICK=4;
    public static final int ESTADO_ADD_SQUARE=5;
    public static final int ESTADO_ADD_CIRCLE=6;
    public static final int ESTADO_ADD_PALM=7;
    public static final int ESTADO_ADD_FLOWER=8;
    public static final int ESTADO_ADD_TUBO=9;
    public static final int ESTADO_ADD_ROCK=10;
    public static final int ESTADO_ADD_FOUNTAIN=11;
    public static final int ESTADO_ADD_POOL=12;
    public static final int ESTADO_ADD_POOL1=13;
    public static final int ESTADO_ADD_LAKE=14;
    public static final int ESTADO_ADD_HOUSE=15;
    public static final int ESTADO_ADD_BRIDGE=16;
    public static final int ESTADO_ADD_WALL=17;
    public static final int ESTADO_ADD_FENCE=18;
    public static final int ESTADO_ADD_FAUCET=19;
    public static final int ESTADO_ADD_ELBOW=20;
    public static final int ESTADO_ADD_UNIONT=21;
    public static final int ESTADO_ADD_TUBO1=22;
    public static final int ESTADO_ADD_END=23;
    
    public static final int TYPE_CONECTOR_T = 1;
    public static final int TYPE_CONECTOR_L = 2;
    
    public static final int MAGNET_SIDE_1=50;
    public static final int MAGNET_SIDE_2=150;
    

    
    private boolean dadosAlterados;
    private File currentFileName;
    private int estado;
    private AreaDesenho areaDesenho;
    

    private LinkedList<Forma> formas;
    
    public Projeto(File selFile){
        dadosAlterados=true;
        currentFileName = null;
        estado=0;
        
        formas = new LinkedList<Forma>();
        
        if (selFile != null){
            lerDados(selFile);
        }
    }
    
    public void addForma(Forma forma){
        formas.add(forma);
    }
    

    
    public void checkForma(int x, int y, boolean doubleClick) {

        //so 1 click
        if (!doubleClick) {
            for (Forma forma : formas) {
                if (forma.getArea().contains(x, y)) {
                    forma.setSelected(true);
                    setEstado(ESTADO_SELECT);
                    if (forma instanceof Tubo)
                        autoConnectTuboHorizontal(forma);
                }
            }
            
            //duplo click
        } else {
            //limpa todos os selected primeiro
            clearSelected();
            for (Forma forma : formas) {
                if (forma.getArea().contains(x, y)) {
                    forma.setSelected(true);

                    forma.jprop.setProjeto(this);
                    forma.jprop.setVisible(true);

                    setEstado(ESTADO_SELECT);
                }
            }
        }
    }
    
    public void autoConnectTuboHorizontal(Forma first) {

        Rectangle rect = new Rectangle(first.getX(), first.getY() - MAGNET_SIDE_1/2 , MAGNET_SIDE_2, MAGNET_SIDE_1);
        Rectangle rect2;
        //Area rectArea;
        int tx, ty;

        for (Forma forma : formas) {
            if (forma instanceof Tubo && forma != first) {
                rect2 = new Rectangle(forma.getX(), forma.getY(), forma.getLargura(), forma.getAltura());

                if (rect.intersects(rect2)) {
                    //System.out.println("perto");
                    tx = forma.getX();
                    forma.setXY(tx, first.getY());
                    //addConector(first.largura+first.getX(), first.getY(), TYPE_CONECTOR_T);
                } else {
                    //System.out.println("nao");
                }

            }
        }

    }
    
    public void addConector(int x, int y, int type) {

        Rectangle rect = new Rectangle(x, y, 100, 100);
        Rectangle rect2;
        boolean ok = true;

        if (type == TYPE_CONECTOR_T) {
            for (Forma forma : formas) {
                if (forma instanceof LigacaoT) {
                    rect2 = new Rectangle(forma.getX(), forma.getY(), forma.getLargura(), forma.getAltura());
                    if (rect.intersects(rect2)) {
                        ok = false;
                    }
                }
            }
            
            if (ok) {
                Forma forma2 = new LigacaoT(x, y, "Ligação T");
                addForma(forma2);
            }

        }
    }


    public void moveSelected(int x, int y) {
        Forma first = firstFormaSelected();
        first.setXY(x, y);
    }

    public Forma firstFormaSelected(){
        Forma first = null;
        int i = 0;
        for (Forma forma : formas) {
            if (forma.getSelected() == true && i==0) {
                first = forma;
                i++;
            } else {
                forma.setSelected(false);
            }
        }
        return first;
    }
    
    public void unionSelected(){
        //get first poligono that's selected and is of type poligono
        Forma first = firstPoligono();
        
        if (first==null) return;
        Area tmp = null;
        tmp = first.getArea();
       
       for (Forma forma:formas){
            if (forma.getSelected()==true && forma instanceof Poligono && forma!=first){
             tmp.add(forma.getArea());
            }
        }
       first.setArea(tmp);
       System.out.println(tmp.toString());
       //remove todos os poligonos selecionados
       removeSelectedPoligonos();
       //volta a adicionar a lista o primeiro
       formas.add(first);  
    }
    
     
    public void diferenceSelected(){
        //get first poligono that's selected and is of type poligono
        Forma first = firstPoligono();
        
        if (first==null) return;
        Area tmp = null;
        tmp = first.getArea();
       
       for (Forma forma:formas){
            if (forma.getSelected()==true && forma instanceof Poligono && forma!=first){
                tmp.subtract(forma.getArea());
                
            }
        }
       first.setArea(tmp);
       System.out.println(tmp.toString());
       //remove todos os poligonos selecionados
       removeSelectedPoligonos();
       //volta a adicionar a lista o primeiro
       formas.add(first);  
    }
    
     public void intersectionSelected(){
        //get first poligono that's selected and is of type poligono
        Forma first = firstPoligono();
        
        if (first==null) return;
        Area tmp = null;
        tmp = first.getArea();
       
       for (Forma forma:formas){
            if (forma.getSelected()==true && forma instanceof Poligono && forma!=first){
                tmp.intersect(forma.getArea());
            }
        }
       first.setArea(tmp);
       System.out.println(tmp.toString());
       //remove todos os poligonos selecionados
       removeSelectedPoligonos();
       //volta a adicionar a lista o primeiro
       formas.add(first);  
    }
    
    public void removeSelectedPoligonos(){
        Forma temp = null;
        LinkedList<Forma> novas = new LinkedList<Forma>();
        
         while(!formas.isEmpty()){
             temp= formas.pop();
           if (!(temp.getSelected()==true && temp instanceof Poligono)){
               novas.add(temp);
           }  
        }
        formas = novas;
    }
    
    //get first poligono that's selected and is of type poligono
    public Forma firstPoligono(){
        Forma first=null;
       for (Forma forma:formas){
            if (forma.getSelected()==true && forma instanceof Poligono){
               first = forma; 
               break;
            }
        } 
       return first;
    }
    
    public void setTypeArea(int typeArea){
        Poligono pol;
         for (Forma forma:formas){
            if (forma.getSelected()==true && forma instanceof Poligono){
               pol = (Poligono) forma;
               pol.setTypeArea(typeArea);
            }
        }
    }
    
    
    public boolean getDadosAlterados(){
        return dadosAlterados;
    }
    
    private void lerDados(File selFile){
        
    }
    
    public int saveDados(){
        int erro = 0;
        
        if (erro==1){
            return 1;
        }
        
        return 0;
    }
    
    public File getCurrentFileName(){
        return currentFileName;
    }
    public void setEstado(int estado){
        this.estado = estado;
    }
    
    public int getEstado(){
        return estado;
    }
    
     public void setAreaDesenho(AreaDesenho areadesenho) {
        this.areaDesenho = areadesenho;
    }
    
    public void displayShapes(Graphics g){
        for (Forma forma:formas){
            forma.desenhar(g);
            if (forma.getSelected()) forma.desenharSelBox(g);
           
        }
    }
    
   
    
    public void clearSelected(){
 
        for (Forma forma:formas){
            forma.setSelected(false);
        }
       
        setEstado(ESTADO_NONE);
        
    }
}
